package com.taskmanager.service;

import com.taskmanager.dao.UserDao;
import com.taskmanager.dto.LoginRequest;
import com.taskmanager.dto.RegisterRequest;
import com.taskmanager.dto.UserResponse;
import com.taskmanager.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 用户业务逻辑层
 */
@Service
public class UserService {
    
    @Autowired
    private UserDao userDao;
    
    @Autowired
    private CategoryService categoryService;
    
    private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    
    /**
     * 用户注册
     * @param request 注册请求
     * @return 用户响应
     */
    @Transactional(rollbackFor = Exception.class)
    public UserResponse register(RegisterRequest request) {
        // 1. 验证用户名是否已存在
        if (userDao.existsByUsername(request.getUsername())) {
            throw new IllegalArgumentException("用户名已被使用");
        }
        
        // 2. 验证邮箱是否已存在
        if (userDao.existsByEmail(request.getEmail())) {
            throw new IllegalArgumentException("邮箱已被使用");
        }
        
        // 3. 创建用户对象
        User user = new User();
        user.setUsername(request.getUsername());
        user.setPassword(passwordEncoder.encode(request.getPassword())); // 加密密码
        user.setEmail(request.getEmail());
        
        // 4. 保存用户到数据库
        int result = userDao.insert(user);
        if (result <= 0) {
            throw new RuntimeException("用户注册失败");
        }
        
        // 5. 为新用户创建默认分类
        categoryService.createDefaultCategories(user.getUserId());
        
        // 6. 返回用户信息（不包含密码）
        UserResponse response = new UserResponse();
        response.setUserId(user.getUserId());
        response.setUsername(user.getUsername());
        response.setEmail(user.getEmail());
        
        return response;
    }
    
    /**
     * 用户登录验证
     * @param request 登录请求
     * @return 用户对象（验证成功）
     */
    public User login(LoginRequest request) {
        // 1. 根据用户名查询用户
        User user = userDao.selectByUsername(request.getUsername());
        if (user == null) {
            throw new IllegalArgumentException("用户名或密码错误");
        }
        
        // 2. 验证密码
        if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
            throw new IllegalArgumentException("用户名或密码错误");
        }
        
        return user;
    }
    
    /**
     * 根据用户ID查询用户
     * @param userId 用户ID
     * @return 用户对象
     */
    public User getUserById(Long userId) {
        User user = userDao.selectById(userId);
        if (user == null) {
            throw new IllegalArgumentException("用户不存在");
        }
        return user;
    }
    
    /**
     * 根据用户名查询用户
     * @param username 用户名
     * @return 用户对象
     */
    public User getUserByUsername(String username) {
        return userDao.selectByUsername(username);
    }
    
    /**
     * 验证密码
     * @param rawPassword 原始密码
     * @param encodedPassword 加密后的密码
     * @return 是否匹配
     */
    public boolean verifyPassword(String rawPassword, String encodedPassword) {
        return passwordEncoder.matches(rawPassword, encodedPassword);
    }
    
    /**
     * 加密密码
     * @param rawPassword 原始密码
     * @return 加密后的密码
     */
    public String encodePassword(String rawPassword) {
        return passwordEncoder.encode(rawPassword);
    }
}
